延續前一篇,同樣是與安全性有關的主題,這篇聚焦在認證跟授權,Spring Security提供安全管理功能,其中Token跟Session是最常見的驗證方式,但究竟有什麼不同呢?使用上又該如何選擇?
Session主要是基於伺服器狀態的驗證方式,當使用者登錄時,伺服器會產生一個Session紀錄,此Session ID會存於瀏覽器Cookie中,並自動發送給伺服器,當客戶端發送請求時,都會將Session ID帶入,伺服器就會透過此Session ID來查找對應的使用者狀態。
Spring Security預設會自動處理Session認證,因此配置以下基本設定即可:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurrity http) throws Exception {
http
.authorizeRequests()
.anyRequest().authenticated() // 說明任何請求需經過認證
.and()
.formLogin() // 啟用登入功能
.permitAll() // 允許所有使用者進入登入頁面
.and()
.logout() // 啟用登出功能
.permitAll(); // 允許所有使用者使用登出功能
}
}
Token是屬於無狀態的認證方式,在使用者登錄後,伺服器會生成Token,並發送給客戶端,當客戶端每次請求時,都需要攜帶此Token,伺服器會用Token比對驗證來確認使用者身分,因此,不用將認證ID存於伺服器端。
Spring Boot當中,可使用JWT(JSON Web Token)實現Token認證:
@configuration
@EnableWebSecurity
public class SecurityConfig extends WebSeurityConigurerAdapter {
@Override
protect void configure(HttpSecurity http) throws Excepiton {
http
.csrf().disable() // 關閉CSRF
.authorizeRequests()
.antMatchers("/loggin").permitAll() // 放入免授權可拜訪的路徑
.anyRequest.authenticated() // 其他需認證的路徑
.and()
.addFilter(new JwtAuthenticationFiltr(authenticationManager())) // JWT過濾器
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS); // 說明不用session
}
}
綜合上述,Token使用越來越普遍,特別是現今追求為服務架構或跨多種設備的狀況下,Token更好適用這些場景,而Session則是簡單快速的選擇,特別適用於單一伺服器,用於傳統web場景。